package Thread;

class Count{
    public static int count=0;
public  synchronized  void add(){
       count++;
    }
}
public class ThreadDemo9 {


    public static void main(String[] args) {    //这种情况是出现了一种多个线程对同一个变量发生修改，是典型的线程安全问题
                                                //出现线程安全问题有几个典型的实例
                                                  //1.多个线程对同一个变量进行修改
        Count count=new Count();                 //2.原子性问题:进行的操作不是原子的，原子就是不可再分的，要么就是全部执行，要么就是全部不执行
       Thread t1=new Thread(()->                 //3.内存可见性问题，就是修改后，不会到内存中重新取数据，当别的线程修改了这个变量，其他线程没有会到内存中
                                                 //重新取数据
                                                  //4.指令重排序问题:编译器的优化，可能会把执行的顺序改变
       {
           for (int i = 0; i <50000 ; i++) {
               count.add();
           }
       });
       Thread t2=new Thread(()-> {
           for (int i = 0; i < 50000; i++) {
               count.add();
           }
       });
       t1.start();
       t2.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Count.count);
    }
}
